package org.fixies.spreadsheet.excel.jxl;

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.fixies.resource.ResourceLoader;
import org.fixies.spreadsheet.interpreter.BookContext;
import org.fixies.spreadsheet.interpreter.SheetContext;
import org.fixies.utils.IOUtils;
import org.fixies.utils.UnexpectedProblemException;

import java.io.IOException;
import java.io.InputStream;

/**
 * Java Excel APIを用いたBookContextインタフェース実装クラス
 *
 * @author Kawasaki
 */
public class JxlBookContext implements BookContext {

    /**
     * ブック
     */
    private Workbook workbook_;

    /**
     * 現在のシートを指すインデックス
     */
    private int sheetIndex_ = -1;

    /**
     * デフォルトコンストラクタ
     */
    public JxlBookContext() {
    }

    /**
     * コンストラクタ
     *
     * @param is エクセルファイルを読み込む入力ストリーム
     */
    public JxlBookContext(InputStream is) {
        load(is);
    }

    /**
     * @see org.fixies.spreadsheet.interpreter.BookContext#current()
     */
    public SheetContext current() {
        Sheet nextSheet = workbook_.getSheet(sheetIndex_);
        SheetContext sheetContext = createSheetContext(nextSheet);
        return sheetContext;
    }

    /**
     * @see org.fixies.spreadsheet.interpreter.BookContext#hasNext()
     */
    public boolean hasNext() {
        return sheetIndex_ < workbook_.getNumberOfSheets() - 1;   // 初期値-1なので1引く
    }

    /**
     * @see org.fixies.spreadsheet.interpreter.BookContext#next()
     */
    public SheetContext next() {
        sheetIndex_++;
        return current();
    }




    /** {@inheritDoc} */ 
    public final void load(InputStream is) {
        try {
            workbook_ = Workbook.getWorkbook(is);
        } catch (BiffException e) {
            throw new UnexpectedProblemException(e);
        } catch (IOException e) {
            throw new UnexpectedProblemException(e);
        }
    }

    protected SheetContext createSheetContext(Sheet sheet) {
        return new JxlSheetContext(sheet);
    }

    @Override
    public void load(String resourceName, ResourceLoader resourceLoader) {
        InputStream in = resourceLoader.loadResource(resourceName + ".xls");
        try {
            load(in);
        } finally {
            IOUtils.closeQuietly(in);
        }
    }
}
